/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　　┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　┃
 * 　　┃　　　　　　　┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛
 * 　　　　┃　　　┃神兽保佑, 永无BUG!
 * 　　　　┃　　　┃Code is far away from bug with the animal protecting
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━感觉萌萌哒━━━━━━
 */
package com.zkgengkun.support.component;

import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @author gengshikun
 * @date 2017/11/22
 */
@Component
@ServerEndpoint("/test/mywebsocket")
public class MySocket {

    //初始在线人数
    //    private static int online_num = 0;
    private static Map<String, Integer> nums = new HashMap<>();
    //线程安全的socket集合
    //    private static CopyOnWriteArraySet<MySocket> webSocketSet = new CopyOnWriteArraySet<MySocket>();
    private static final Map<String, CopyOnWriteArraySet<MySocket>> sockets = new HashMap<>();
    //会话
    private Session session;

    @OnOpen
    public void onOpen(Session session) throws IOException {
        String liveId = session.getRequestParameterMap().get("liveId").get(0);
        if(StringUtils.isNotBlank(liveId)) {
            this.session = session;

            CopyOnWriteArraySet<MySocket> sessionSet = sockets.get(liveId);
            if (sessionSet == null) {
                CopyOnWriteArraySet<MySocket> newSessionSet = new CopyOnWriteArraySet<>();
                newSessionSet.add(this);
                sockets.put(liveId, newSessionSet);
            } else {
                sessionSet.add(this);
            }

            addOnlineCount(liveId);
            for(MySocket item : sockets.get(liveId)){
                item.session.getBasicRemote().sendText(Integer.toString(getOnline_num(liveId)));
            }
        }
    }

    @OnClose
    public void onClose() throws IOException {
        String liveId = this.session.getRequestParameterMap().get("liveId").get(0);

        CopyOnWriteArraySet<MySocket> sessionSet = sockets.get(liveId);
        if (sessionSet != null) {
            sessionSet.remove(this);
        }
        subOnlineCount(liveId);
        for(MySocket item:sockets.get(liveId)){
            item.session.getBasicRemote().sendText(Integer.toString(getOnline_num(liveId)));
        }
    }

    @OnMessage
    public void onMessage(String message,Session session) throws IOException {
        System.out.println("来自客户端的消息:"+message);
        /*for(MySocket item:webSocketSet){
            item.session.getBasicRemote().sendText("来自客户端的消息:"+message);
        }*/
    }

    @OnError
    public void onError(Throwable e, Session session){
    }
    public synchronized int getOnline_num(String liveId){
        return MySocket.nums.get(liveId);
    }
    public synchronized int subOnlineCount(String liveId){
        int num = nums.get(liveId) == null ? 0 : nums.get(liveId);
        nums.put(liveId, --num);
        return num;
    }
    public synchronized int addOnlineCount(String liveId){
        int num = nums.get(liveId) == null ? 0 : nums.get(liveId);
        nums.put(liveId, ++num);
        return num;
    }

}
